unit uShoppingCart;

interface

uses
  Classes, SysUtils, IWAppForm, IWApplication, IWTypes, frProductTree,
  frTopBar, Controls, Forms, {frBottomBar,} IWBaseControl,
  IWControl, IWCompLabel, IWGrids, IWCompButton, IWVCLBaseControl,
  IWCompRectangle, IWHTMLControls, Graphics, IWCOlor;

type
  TISFShoppingCart = class(TIWAppForm)
    rectMain: TIWRectangle;
    rectLeft: TIWRectangle;
    rectTitle: TIWRectangle;
    lblShoppingCart: TIWLabel;
    grdItems: TIWGrid;
    lblTotal: TIWLabel;
    lnkUpdateCart: TIWLink;
    lnkFinalize: TIWLink;
    LeftTree: TISFProductTree;
    TopBar: TISFTopBar;
    procedure IWAppFormCreate(Sender: TObject);
    procedure lnkUpdateCartClick(Sender: TObject);
    procedure lnkFinalizeClick(Sender: TObject);
    procedure LeftTreelnkSourceClick(Sender: TObject);
  protected
     procedure LoadCart;
  public
  end;

implementation

{$R *.dfm}

uses
  DB,
  dmDieFlyDie,
  IWBaseForm, IWCompEdit, IWCompCheckBox,
  ServerController,
  uDisplayProduct, uDBInterface, uFinalize,
  uConstants; 

procedure TISFShoppingCart.IWAppFormCreate(Sender: TObject);
begin
  // Load the product tree
  LeftTree.LoadTree;

  // Load the cart
  LoadCart;
end;

procedure TISFShoppingCart.LoadCart;
var
  f, g : integer;
  LEdit : TIWEdit;
  LCheck : TIWCheckBox;
  LBigTotal : double;
begin
  LBigTotal := 0;


  with dmFly.qrCart, grdItems do
  begin
     SQL.Clear;
     SQL.Add('SELECT Quantity, ProductID, Name, Price');
     SQL.Add('FROM Cart, Products');
     SQL.Add('WHERE Products.ID = ProductID AND SessionID = :ASessionID');
     ParamByName('ASessionID').AsInteger := UserSession.CartUserID;
     Open;

     RowCount := 1;

     Cell[0, 0].Width := '40%';
     Cell[0, 0].Text := 'Name';

     Cell[0, 1].Width := '15%';
     Cell[0, 1].Text := 'Quantity';

     Cell[0, 2].Width := '15%';
     Cell[0, 2].Text := 'Price per unit';

     Cell[0, 3].Width := '15%';
     Cell[0, 3].Text := 'Total price';

     Cell[0, 4].Width := '15%';
     Cell[0, 4].Text := 'Remove';

     for f := 0 to 4 do
     begin
        Cell[0, f].Font.Style := [fsBold];
        Cell[0, f].Alignment := taCenter;
        Cell[0, f].Height := IntToStr(lcHeaderCellHeight);
     end;

     f := 0;

     while not Eof do
     begin
        RowCount := RowCount + 1;
        Cell[f + 1, 0].Text := FieldByName('Name').AsString;
        Cell[f + 1, 0].Width := '40%';

        LEdit := TIWEdit.Create(Self);
        LEdit.Parent := Self;
        LEdit.Text := FieldByName('Quantity').AsString;
        LEdit.Tag := FieldByName('ProductID').AsInteger;
        LEdit.Alignment := taLeftJustify;
        LEdit.Width := 50;

        Cell[f + 1, 1].Control := LEdit;
        Cell[f + 1, 1].Alignment := taRightJustify;
        Cell[f + 1, 1].Width := '15%';

        Cell[f + 1, 2].Text := FormatFloat('###,###,###,###.00', FieldByName('Price').AsFloat);
        Cell[f + 1, 2].Alignment := taRightJustify;
        Cell[f + 1, 2].Width := '15%';

        Cell[f + 1, 3].Text := FormatFloat('###,###,###,###.00', FieldByName('Price').AsFloat * FieldByName('Quantity').AsInteger);
        Cell[f + 1, 3].Alignment := taRightJustify;
        Cell[f + 1, 3].Width := '15%';

        LBigTotal := LBigTotal + FieldByName('Price').AsFloat * FieldByName('Quantity').AsInteger;

        LCheck := TIWCheckBox.Create(Self);
        LCheck.Parent := Self;
        LCheck.Caption := '';
        LCheck.Tag := FieldByName('ProductID').AsInteger;
//        LCheck.Hint := 'Check this box then press -Update cart- to remove product.';
        Cell[f + 1, 4].Control := LCheck;
        Cell[f + 1, 4].Alignment := taCenter;
        Cell[f + 1, 4].Width := '15%';

        for g := 0 to 4 do
           Cell[f + 1, g].Height := IntToStr(lcCellHeight);

        f := f + 1;
        Next;
     end;
     Close;

     RowCount := RowCount + 1;
  end;

   // Set colors
  for f := 0 to Pred(grdItems.RowCount) do
     for g := 0 to 4 do
        if f in [0, Pred(grdItems.RowCount)] then
           grdItems.Cell[f, g].BGColor := lcHeaderColor
        else
           if f mod 2 = 0 then
              grdItems.Cell[f, g].BGColor := lcEvenColor
           else
              grdItems.Cell[f, g].BGColor := lcOddColor;

  lblTotal.Top := grdItems.Top + grdItems.RowCount * lcCellHeight + 10;
  lblTotal.Caption := Format(lblTotal.Text, [FormatFloat('###,###,###,###.00', LBigTotal)]);

  lnkUpdateCart.Top := lblTotal.Top + lblTotal.Height + 20;
  lnkFinalize.Top := lnkUpdateCart.Top;
end;

procedure TISFShoppingCart.lnkUpdateCartClick(Sender: TObject);
var
  f : integer;
begin
  with dmFly.qrCart, grdItems do
  begin
     for f := 1 to RowCount - 2 do
     begin
        SQL.Clear;
        if TIWCheckBox(Cell[f, 4].Control).Checked then
        begin
           SQL.Add('DELETE FROM Cart');
           SQL.Add('WHERE SessionID = :ASessionID AND ProductID = :AProductID');
           ParamByName('ASessionID').AsInteger := UserSession.CartUserID;
           ParamByName('AProductID').AsInteger := TIWCheckBox(Cell[f, 4].Control).Tag;
           ExecSQL;
        end
        else
        begin
           SQL.Add('UPDATE Cart SET Quantity = :AQuantity');
           SQL.Add('WHERE SessionID = :ASessionID AND ProductID = :AProductID');
           ParamByName('ASessionID').AsInteger := UserSession.CartUserID;
           ParamByName('AProductID').AsInteger := TIWCheckBox(Cell[f, 4].Control).Tag;
           ParamByName('AQuantity').AsString := TIWEdit(Cell[f, 1].Control).Text;
           ExecSQL;              
        end;
     end;
  end;

  LoadCart;
end;

procedure TISFShoppingCart.lnkFinalizeClick(Sender: TObject);
begin
  if not UserSession.LoggedIn then
     UserSession.NeedLogin(TISFFinalize)
  else
  begin
     TIWAppForm(WebApplication.ActiveForm).Release;
     TISFFinalize.Create(WebApplication).Show;
  end;
end;

procedure TISFShoppingCart.LeftTreelnkSourceClick(Sender: TObject);
begin
  LeftTree.lnkSourceClick(Sender);

end;

end.
